iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
0
Modern Web

讀官網文件邊走邊學nest.js系列 第 19

Day19-TypeORM(六) Query Builder Select(上)

  • 分享至 

  • xImage
  •  

TypeORM Repository已經寫好常用對資料庫新增、修改、搜尋(find說明文件)、刪除資料
TypeORM Repository API列表

如果要更細部的建立Query,TypeORM提供Query Builder相關API,以API的方式去組SQL Query,比較彈性。但相對於repository API,QueryBuilder比較容易出錯,如果對SQL沒有很熟的話,加上打字串比例增加(容易打錯)....

使用QueryBuilder只要在注入的repository變數呼叫createQueryBuilder,

例如要以部門名稱搜尋使用者,並按照使用者名稱排序

新增getUsersByDepName於users.service.ts

    async getUsersByDepName(depName: string){
     
     return await this.userRepo
       .createQueryBuilder('u') // 指定User別名為u
       // 指定join user的roles關聯屬性,並指定別名為r,並設定搜尋條件
       .leftJoinAndSelect('u.roles', 'r')
       // 指定join user的dep關聯屬性,並指定別名為d,並設定搜尋條件
       .leftJoinAndSelect('u.dep', 'd')
       // 設定條件
       .where('u.isActive = :isActive', {isActive: true})
       .andWhere('d.depName like :name', { name: `%${depName.toLowerCase()}%`})
       // 以username降冪排序
       .orderBy('username', 'DESC')
       // 回傳多筆資料
       .getMany();
       // 回傳上面API所組出來的Raw SQLㄝ, debug用
       // .getSql()
    }

到app.controller新增路由


...
@Get('query/user')
  queryByDepName(@Query('depName') depName){
    return this.usersService.getUsersByDepName(depName);
  }
...

使用postman測試
實際產生的SQL

SELECT "u"."id" AS "u_id", "u"."username" AS "u_username", "u"."email" AS "u_email", "u"."isActive" AS "u_isActive", "u"."depId" AS "u_depId", "r"."id" AS "r_id", "r"."roleName" AS "r_roleName", "d"."id" AS "d_id", "d"."depName" AS "d_depName" FROM "My_Users" "u" LEFT JOIN "my__users_roles_role" "u_r" ON "u_r"."myUsersId"="u"."id" LEFT JOIN "role" "r" ON "r"."id"="u_r"."roleId"  LEFT JOIN "Departments" "d" ON "d"."id"="u"."depId" WHERE "u"."isActive" = $1 AND "d"."depName" = $2 ORDER BY username DESC

實際資料

或許是習慣.net的FluentAPI,TypeORM顯得卡卡,今天花蠻多時間在除錯的,還有另外Custom Repository自己try的過程也不順,也就沒有分享。

明天繼續

Github source code


上一篇
Day18-TypeORM(五) 設定多對多
下一篇
Day20-TypeORM(七) Query Builder Select(下)
系列文
讀官網文件邊走邊學nest.js31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言